/**
 * @file 路由中语言处理
 */

import cookie from '@/utils/cookie';
import Store from '@/store';
import types from '@/store/types';
import {
    i18n,
    getBrowserLanguage,
    isSupportLang,
    langs,
    findLang,
} from '@/locales';

export default [
    // 语言兼容大小写
    ({
        path, query, hash, meta,
    }, from, next) => {
        const lang = path.split('/')[1];

        if (!isSupportLang(lang) && findLang(lang)) {
            return next({
                path: `/${findLang(lang)}/${path.split('/').slice(2).join('/') || ''}`,
                query,
                hash,

                // 这里使用 repalce 是因为识别了老版本的语言（大写）
                // 那么应该让浏览器直接 replace ，不让用户再返回错误的链接
                replace: true,
            });
        }

        if (meta && meta.title) {
            document.title = i18n.global.t(meta.title);
        }

        next();
    },

    // 识别语言
    ({
        path, query, hash, meta,
    }, from, next) => {
        let lang = path.split('/')[1];

        // 如果连接中没有语言，则使用 cookie.lang > browser > default
        if (langs.length > 1 && !isSupportLang(lang)) {
            if (isSupportLang(cookie.get('lang'))) {
                lang = cookie.get('lang');
            } else {
                lang = i18n.global.locale.value || getBrowserLanguage();
            }

            return next({
                path: `/${lang}/${path.replace(/^\/+/g, '')}`,
                query,
                hash,

                // 这里不能用 replace 是因为有的跳转路径是 /login 这种
                // 如果 replace 那么上面的跳转路径就不会产生历史记录
                // 这样会触发个问题，就是直接访问 / 时，会产生一条多余的历史记录，因为不确定是直接输入，还是 href="/"
                // replace: true,
            });

            // 单语言时，显式的写支持的语言，自动切换到无语言版本
        }

        if (langs.length === 1 && isSupportLang(lang)) {
            return next({
                path: `${path.replace(`/${lang}/`, '/')}`,
                query,
                hash,
                replace: true,
            });
        }

        // 设置语言，单语言忽略
        if (langs.length > 1) {
            Store.dispatch(types.SET_LANG, {
                replace: lang !== cookie.get('lang'),
                lang,
            });
        } else {
            Store.dispatch(types.SET_LANG, {
                replace: langs[0] !== cookie.get('lang'),
                lang: langs[0],
            });
        }

        if (meta && meta.title) {
            document.title = i18n.global.t(meta.title);
        }

        next();
    },
];
